home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / mknod.c < prev    next >
C/C++ Source or Header  |  1988-08-07  |  2KB  |  82 lines

  1. /* 
  2.  * mknod.c --
  3.  *
  4.  *    Procedure to map from Unix mknod system call to Sprite.
  5.  *
  6.  * Copyright (C) 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  */
  9.  
  10. #ifndef lint
  11. static char rcsid[] = "$Header: mknod.c,v 1.3 88/06/29 15:41:05 ouster Exp $ SPRITE (Berkeley)";
  12. #endif not lint
  13.  
  14. #include "sprite.h"
  15. #include "fs.h"
  16. #include "compatInt.h"
  17. #include <errno.h>
  18. #include <sys/file.h>
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21.  
  22.  
  23. /*
  24.  *----------------------------------------------------------------------
  25.  *
  26.  * mknod --
  27.  *
  28.  *    Procedure to map from Unix mkdir system call to Sprite Fs_MakeDevice.
  29.  *    Unfortunately, this doesn't map from Unix land device types to
  30.  *    Sprite device types.  This means a tar of /dev on a UNIX system
  31.  *    will not be recreated correctly on a Sprite system, unless the
  32.  *    tar program itself is fixed.
  33.  *
  34.  * Results:
  35.  *    UNIX_ERROR is returned upon error, with the actual error code
  36.  *    stored in errno.  Otherwise UNIX_SUCCESS is returned.
  37.  *
  38.  * Side effects:
  39.  *    Creates a special file used to refer to a device.
  40.  *
  41.  *----------------------------------------------------------------------
  42.  */
  43.  
  44. int
  45. mknod(pathName, mode, dev)
  46.     char *pathName;        /* The name of the directory to create */
  47.     int mode;            /* Permission mask plus type */
  48.     int dev;            /* Specifies minor and major dev numbers */
  49. {
  50.     ReturnStatus status;    /* result returned by Fs_Open */
  51.     int streamID;
  52.  
  53.     switch (mode & S_IFMT) {
  54.     case S_IFREG:
  55.         status = Fs_Open(pathName, FS_CREATE, mode & 0777, &streamID);
  56.         if (status == SUCCESS) {
  57.         (void)close(streamID);
  58.         }
  59.         break;
  60.     case S_IFBLK:
  61.     case S_IFCHR: {
  62.         Fs_Device device;
  63.  
  64.         device.serverID = FS_LOCALHOST_ID;
  65.         device.type = major(dev);
  66.         device.unit = minor(dev);
  67.  
  68.         status = Fs_MakeDevice(pathName, &device, mode & 0777);
  69.         break;
  70.     }
  71.     default:
  72.         errno = EINVAL;
  73.         return(UNIX_ERROR);
  74.     }
  75.      if (status != SUCCESS) {
  76.     errno = Compat_MapCode(status);
  77.     return(UNIX_ERROR);
  78.     } else {
  79.     return(UNIX_SUCCESS);
  80.     }
  81. }
  82.